home *** CD-ROM | disk | FTP | other *** search
/ PC Open 107 / PC Open 107 CD 1.bin / CD1 / INTERNET / COPIA SITI / Getleft / getleft-setup-notcl.exe / {app} / Getleft.tcl < prev    next >
Encoding:
Text File  |  2004-06-07  |  57.2 KB  |  1,678 lines

  1. #!/bin/sh
  2. ###############################################################################
  3. ###############################################################################
  4. #                               Getleft
  5. ###############################################################################
  6. ###############################################################################
  7. # copyright (C) 1999-2004 Andres Garcia Garcia - fandom@retemail.es
  8. # Distributed under the terms of the GPL v2
  9. ###############################################################################
  10. ###############################################################################
  11. # Version 1.1.2
  12. ###############################################################################
  13. ###############################################################################
  14. # This program recursively downloads Web sites, as it goes, it changes absolute
  15. # paths in the links to relative ones and links to active content pages get
  16. # changed to the resulting pages.
  17. ###############################################################################
  18. # The following looks for the latest version of wish in you path, it is 
  19. # specially useful in FreeBSD where 'wish' only gives a warning that it
  20. # doesn't work. \
  21. wish=`( for name in $(ls $(echo $PATH | sed 's/:/ /g') 2> /dev/null | grep wish8.4); do echo $name ; done ) | tail -1`
  22. # \
  23. [ -z "$wish" ] && wish=`(for name in $(ls $(echo $PATH | sed 's/:/ /g') 2> /dev/null | grep wish8.3); do echo $name ; done ) | tail -1`
  24. # \
  25. [ -z "$wish" ] && wish=`(for name in $(ls $(echo $PATH | sed 's/:/ /g') 2> /dev/null | grep wish8.2); do echo $name ; done ) | tail -1`
  26. # \
  27. [ -z "$wish" ] && wish=`(for name in $(ls $(echo $PATH | sed 's/:/ /g') 2> /dev/null | grep wish8.1); do echo $name ; done ) | tail -1`
  28. # \
  29. [ -z "$wish" ] && wish=wish
  30. # \
  31. exec $wish "$0" ${1+"$@"}
  32.  
  33. ###############################################################################
  34. # CheckPrograms
  35. #    Some checks to know if Getleft will be able to run.
  36. #
  37. # Side effects:
  38. #    If one of the programs is not in the path, the procedure will exit the
  39. #    program after issuing a error message.
  40. ###############################################################################
  41. proc CheckPrograms {} {
  42.     global getleftState errorCode tcl_version
  43.  
  44.     if {$tcl_version<8.1} {
  45.         tk_messageBox -icon error -type ok -message "This program only works with\n\
  46.                 Tcl/Tk v 8.1 or newer, yours is:\n\t $tcl_version" -title Error
  47.         exit
  48.     }
  49.  
  50.     if {$getleftState(os)=="win"} {
  51.         package require registry
  52.         if {[catch {load winkill.dll} result]} {
  53.             tk_messageBox -type ok -icon error -title Error \
  54.                     -message "Couldn't load 'winkill.dll'."
  55.             exit
  56.         }
  57.     } 
  58.     return
  59. }
  60.  
  61. ###############################################################################
  62. # GetPlatform
  63. #    A procedure to learn, once and for always, in which platform we are.
  64. #
  65. # Returns
  66. #    One of 'win', 'mac' or 'unix'.
  67. ###############################################################################
  68. proc GetPlatform {} {
  69.     global tcl_platform
  70.  
  71.     if {$tcl_platform(platform)=="windows"} {
  72.         return win
  73.     }
  74.     if {$tcl_platform(os)=="Darwin"} {
  75.         return mac
  76.     }
  77.     return unix
  78. }
  79.  
  80. ###############################################################################
  81. # GetMainDirectory
  82. #    This procedure investigates where the 'Getleft.tcl' or 'Getleft.exe' file
  83. #    are.
  84. #
  85. # Returns:
  86. #    The directory.
  87. ###############################################################################
  88. proc GetMainDirectory {} {
  89.  
  90.     set scriptDir [info script]
  91.     if {[file pathtype $scriptDir]=="relative"} {
  92.         set scriptDir [string trimleft $scriptDir ./]
  93.         set scriptDir [file join [pwd] $scriptDir]
  94.     }
  95.     return [file dirname $scriptDir]
  96. }
  97.  
  98. ###############################################################################
  99. # SetGetleftDirs
  100. #   Depending on the platform we are running in, we have to decide which
  101. #   directories to use.
  102. #
  103. # Parameter
  104. #   platform: 'win', 'mac' or 'unix'.
  105. #
  106. # Side effects:
  107. #   The 'dirGetleft' gets the information, if need be, it creates the 
  108. #   directory into which Getleft will save its configuration data.
  109. ###############################################################################
  110. proc SetGetleftDirs {platform} {
  111.     global dirGetleft env
  112.  
  113.     set dirGetleft(main) [GetMainDirectory]
  114.  
  115.     if {$platform=="win"} {
  116.         set shellFoldersKey {HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders}
  117.         if {[info exists env(USERPROFILE)]} {
  118.             set appData [registry get $shellFoldersKey AppData]
  119.             regsub {%USERPROFILE%} $appData "$env(USERPROFILE)" appData
  120.             set dirGetleft(conf) [file join $appData getleft]
  121.             # Since using this directory is a new thing, we move the older one
  122.             set tmpDir [file join $env(USERPROFILE) getleft]
  123.             if {([file exists $tmpDir])&&(![file exists $dirGetleft(conf)])} {
  124.                 file rename $tmpDir $appData
  125.             }
  126.         } else {
  127.            if {![catch {librarypath}]} {
  128.                 set dirGetleft(conf) [pwd]
  129.            } else {
  130.                 set dirGetleft(conf) $dirGetleft(main)
  131.            }
  132.         }
  133.         if {![catch {set dirGetleft(lastDir) [registry get $shellFoldersKey Personal]}]} {
  134.             catch {regsub {%USERPROFILE%} $dirGetleft(lastDir) \
  135.                     "$env(USERPROFILE)" dirGetleft(lastDir)}
  136.         } else {
  137.            set dirGetleft(lastDir) $dirGetleft(conf)
  138.         }
  139.         set dirGetleft(toolDir) $dirGetleft(lastDir)
  140.     } else {
  141.         if {$platform=="mac"} {
  142.             set dirGetleft(conf) [file join $env(HOME) Library getleft]
  143.         } else {
  144.             set dirGetleft(conf) [file join $env(HOME) .getleft]
  145.         }
  146.         set dirGetleft(lastDir) $env(HOME)
  147.         set dirGetleft(toolDir) $env(HOME)
  148.     }
  149.  
  150.     if {![file exists $dirGetleft(conf)]} {
  151.         if {[catch {file mkdir $dirGetleft(conf)} error]} {
  152.             tk_messageBox -title Error -icon error -type ok \
  153.                     -message "Couldn't create dir:\n$error"
  154.             exit
  155.         }
  156.     }
  157.  
  158.     if {[file exists /etc/getleft.conf]} {
  159.         ReadConfig /etc/getleft.conf
  160.     } elseif {[file exists /usr/local/etc/getleft.conf]} {
  161.         ReadConfig /usr/local/etc/getleft.conf
  162.     } else {
  163.         set dirGetleft(scripts)   [file join "$dirGetleft(main)" scripts]
  164.         set dirGetleft(images)    [file join "$dirGetleft(main)" images]
  165.         set dirGetleft(doc)       [file join "$dirGetleft(main)" doc]
  166.         set dirGetleft(languages) [file join "$dirGetleft(main)" Languages]
  167.     }
  168.  
  169.     # We set a temp dirGetleft(icons) so we can source Ayuda.tcl
  170.     if {![info exists dirGetleft(icons)]} {
  171.         set dirGetleft(icons) $dirGetleft(images)/Crystal
  172.     }
  173.  
  174.     return
  175. }
  176.  
  177. ###############################################################################
  178. # UninstallGetleft
  179. #    When we run Getleft with the 'uninstall' command line option, we ask
  180. #    the user if he wants to delete his log files before uninstalling. 
  181. #
  182. #    This is bit of a kludge to be run from the [UninstallRun] section of
  183. #    Inno Setup.
  184. ###############################################################################
  185. proc UninstallGetleft {} {
  186.     global getleftState dirGetleft argc argv global env
  187.  
  188.     if {$getleftState(os)!="win"} {
  189.         return
  190.     }
  191.     set option [lindex $argv 0]
  192.     if {$option!="uninstall"} {
  193.         exit
  194.     }
  195.  
  196.     set what [tk_messageBox -title Confirm -type yesno -icon question     \
  197.             -message "Do you want to delete your log files?"]
  198.     if {$what=="no"} {
  199.         exit
  200.     }
  201.     if {[info exists env(USERPROFILE)]} {
  202.         if {[catch {file delete -force $dirGetleft(conf)} error]} {
  203.             tk_messageBox -type ok -message $error -title Error -icon error
  204.         }
  205.         exit
  206.     }
  207.     catch {file delete -force      [file join $dirGetleft(conf) getleft.ini]}
  208.     catch {file delete -force      [file join $dirGetleft(conf) getLog.log]}
  209.     catch {file delete -force      [file join $dirGetleft(conf) fileDown.log]}
  210.     catch {file delete -force      [file join $dirGetleft(conf) cookies.txt]}
  211.     set gdtFiles [glob -nocomplain [file join $dirGetleft(conf) *.gdt]]
  212.     foreach gdt $gdtFiles {
  213.         catch {file delete -force $gdt}
  214.     }
  215.     exit
  216. }
  217.  
  218. ###############################################################################
  219. # SetGetleftColours
  220. #     This is one of my world famous kludges, I use it in order to know
  221. #     which colours the system is using. If you know how to do this using
  222. #     the option database, please do so.
  223. ###############################################################################
  224. proc SetGetleftColours {} {
  225.     global getleftOptions
  226.  
  227.     set tmp  [entry .tmp]
  228.     set getleftOptions(bg)    [$tmp cget -background]
  229.     set getleftOptions(fg)    [$tmp cget -foreground]
  230.     set getleftOptions(selBg) [$tmp cget -selectbackground]
  231.     set getleftOptions(selFg) [$tmp cget -selectforeground]
  232.     # Tk default colour for the background of text widgets isn't white
  233.     # even though it should be.
  234.     if {($getleftOptions(bg)=="#dcdcdc")||($getleftOptions(bg)=="#d9d9d9") \
  235.             ||($getleftOptions(bg)=="#eae9e8")||($getleftOptions(bg)=="#e6e7e6")} {
  236.         set getleftOptions(bg) white
  237.     }
  238.     destroy .tmp
  239.  
  240.     set tmp [frame .tmp]
  241.     set getleftOptions(disBg) [$tmp cget -background]
  242.     destroy .tmp
  243.  
  244.     button  .tmp
  245.     .tmp configure -state disable
  246.     set getleftOptions(disFg) [.tmp cget -disabledforeground]
  247.     destroy .tmp
  248.  
  249.     return
  250. }
  251.  
  252. ###############################################################################
  253. # InitializeDownload
  254. #    Takes care of downloading the Url entered by the user starting the
  255. #    download.
  256. #
  257. # Parameter:
  258. #    url: The requested Url.
  259. #
  260. # Returns:
  261. #    The requested url, completed, if necessary with protocol or changed
  262. #    if there was a redirection.
  263. #    An empty string in case of error.
  264. ###############################################################################
  265. proc InitializeDownload {url} {
  266.     global directories siteUrl getleftState getleftOptions
  267.     global labelTitles labelMessages labelCurlCodes
  268.  
  269.     set getleftOptions(stopPage)          0
  270.     set getleftOptions(stopFile)          0
  271.     set getleftOptions(cancelDown)        0
  272.     set getleftState(errorFound)          0
  273.     set getleftOptions(pauseFile)         0
  274.     set getleftOptions(pausePage)         0
  275.     set getleftOptions(pauseNow)          0
  276.     set Ventana::Rizo::curlReport(stop)   0
  277.  
  278.     catch "unset ::Descargar::filesProcessed"
  279.     catch "unset ::Descargar::filesNotFound"
  280.     catch "unset ::Descargar::filesRelocated"
  281.     catch "unset ::Descargar::relocated"
  282.     catch "unset ::Descargar::downloaded"
  283.     catch "unset ::Descargar::oneHundredLosers"
  284.     catch "unset ::Commands::sedChanges"
  285.  
  286.     if {![regexp -nocase {([^:/])(/)} $url]} {
  287.         set url $url/
  288.     }
  289.  
  290.     set siteUrl(url) $url
  291.     set parsedUrl [HtmlParser::ParseUrl $url]
  292.     if {$parsedUrl!=1} {
  293.         set siteUrl(prot) [lindex $parsedUrl 0]
  294.         set siteUrl(www)  [lindex $parsedUrl 1]
  295.         set siteUrl(dir)  [lindex $parsedUrl 2]
  296.         set fileName      [lindex $parsedUrl 3]
  297.         if {$fileName==""} {
  298.             set isHtml 1
  299.         } else {
  300.             set isHtml [regexp -nocase {\.html?$} $fileName]
  301.         }
  302.         if {$siteUrl(prot)==""} {
  303.             set siteUrl(prot) http
  304.             set url http://$url
  305.         } else {
  306.             set siteUrl(prot) [string tolower $siteUrl(prot)]
  307.         }
  308.         set getleftState(noConnect,$siteUrl(www)) 0
  309.     } else {
  310.         tk_messageBox -type ok -title $labelTitles(initError) -icon error \
  311.             -message $labelMessages(formatError)
  312.         return
  313.     }
  314.  
  315.     set directories(local)  $directories(base)
  316.     set siteUrl(base)       [Commands::DeRexString $siteUrl(dir)]
  317.  
  318.     set result [Descargar::Download $url "-" $isHtml]
  319.     if {$result==2} {
  320.         if {($Ventana::Rizo::curlError!=0)&&($Ventana::Rizo::curlError!="")} {
  321.             if {$getleftState(autoDown)==0} {
  322.                 catch {wm withdraw $::Ventana::window(top)}
  323.                 tk_messageBox -icon error -type ok -title $labelTitles(error) \
  324.                          -message "$labelCurlCodes($Ventana::Rizo::curlError)"
  325.             }
  326.             set getleftOptions(stopFile) 1
  327.         }
  328.         return $url
  329.     }
  330.  
  331.     if {($result==1)&&($isHtml==0)} {
  332.         set localFileName [::Commands::UrlToFile $url $directories(base)]
  333.         if {(![regexp -nocase {\.html?$} $localFileName])&&(![file exists $localFileName.html])} {
  334.             if {[catch {file rename -force $localFileName $localFileName.html}]} {
  335.                 return
  336.             }
  337.             Commands::Touch $localFileName
  338.         }
  339.         return $url
  340.     }
  341.  
  342.     if {($result==3)||($result==4)} {
  343.         set parsedUrl [HtmlParser::ParseUrl $Descargar::relocated(url)]
  344.         if {$parsedUrl==1} {
  345.             return
  346.         }
  347.         set fileName      [lindex $parsedUrl 3]
  348.         set siteUrl(base) [Commands::DeRexString $siteUrl(dir)]
  349.         set url $Descargar::relocated(url)
  350.         if {$result==4} {
  351.             set localFileName [::Commands::UrlToFile $url $directories(base)]
  352.             if {(![regexp -nocase {\.html?$} $localFileName])&&(![file exists $localFileName.html])} {
  353.                 if {[catch {file rename -force $localFileName $localFileName.html}]} {
  354.                     return
  355.                 }
  356.                 Commands::Touch $localFileName
  357.             }
  358.         }
  359.     }
  360.     return $url
  361. }
  362.  
  363. ###############################################################################
  364. # TheEnd
  365. #    After downloading is completed or stopped by the user, this procedure
  366. #    takes care of telling the user all about it.
  367. #
  368. # Parameter
  369. #    noEnd: '1' if we don't want the 'It's over' message box.
  370. ###############################################################################
  371. proc TheEnd {{noEnd 0}} {
  372.     global labelTitles labelMessages getleftState dirGetleft directories
  373.     global siteUrl getleftOptions downOptions
  374.  
  375.     set index [lsearch -exact $getleftState(urlQueue) $getleftState(url)]
  376.     set domain [lindex [HtmlParser::ParseUrl $getleftState(url)] 1]
  377.  
  378.     if {($getleftOptions(stopFile)==1)||($getleftOptions(stopPage)==1)} {
  379.         if {($getleftState(autoDown)==1)||($getleftState(delayedDown)==1)} {
  380.             set what yes
  381.  
  382.             if {$getleftState(delayedDown)==1} {
  383.                 catch {wm withdraw $::Ventana::window(top)}
  384.             }
  385. # La tenemos que quitar de la seleccion y de la lista de bajada automatica
  386.             set urlIndex [lsearch $getleftState(urlsToAutoDown) $getleftState(url)]
  387.             if {$urlIndex!=-1} {
  388.                 set getleftState(urlsToAutoDown)                                  \
  389.                         [lreplace $getleftState(urlsToAutoDown)                   \
  390.                                 $urlIndex $urlIndex]
  391.             }
  392.             mainWin::UrlListDeselect $getleftState(url)
  393.         } else {
  394.             catch {wm withdraw $::Ventana::window(top)}
  395.             set what [tk_messageBox -icon question -title $labelTitles(resumeSite)\
  396.                     -type yesno -message $labelMessages(resumeSite)]
  397.         }
  398.         if {[string match $what "yes"]} {
  399.             SaveDownloadData   $getleftState(url)
  400.         } else {
  401.             mainWin::UrlListDeleteEntry $getleftState(url)
  402.             if {[catch {file delete [file join $dirGetleft(conf) $domain.gdt]} errorMsg]} {
  403.                 if {$::DEBUG==1} {
  404.                     tk_messageBox -type ok -icon error \
  405.                         -message "Error deleting file:\n$errorMsg"
  406.                 }
  407.             }
  408.         }
  409.     } else {
  410.         if {($getleftState(autoDown)==0)} {
  411.             catch {wm withdraw $::Ventana::window(top)}
  412.         }
  413.         if {$noEnd==0} {
  414.             tk_messageBox -icon info -title $labelTitles(theEnd) -type ok \
  415.                     -message $labelMessages(theEnd)
  416.         }
  417.         if {$index!=-1} {
  418.             mainWin::UrlListDeleteEntry $getleftState(url)
  419.         }
  420.         if {[catch {file delete [file join $dirGetleft(conf) $domain.gdt]} errorMsg]} {
  421.             if {$::DEBUG==1} {
  422.                 tk_messageBox -type ok -icon error \
  423.                     -message "Error deleting file:\n$errorMsg"
  424.             }
  425.         }
  426.     }
  427.     SaveConfig
  428.     catch {unset ::urlsDownloaded}
  429.     catch {unset ::siteMap}
  430.  
  431.     if {$::getleftState(exiting)==1} {
  432.         exit
  433.     }
  434.     if {$getleftState(delayedDown)==1} {
  435.         set getleftState(delayedDown) 0
  436.         if {$Delay::delayedDownload(days)==0} {
  437.             set getleftState(delaySet) 0
  438.         }
  439.     }
  440.  
  441.     set getleftState(downloading) 0
  442.     set getleftState(filesChosen) 0
  443.     set getleftState(mapDone)     0
  444.  
  445.     catch {unset getleftState(mapLinks)}
  446.     catch {unset ::siteMap}
  447.     catch {unset ::HtmlParser::links}
  448.  
  449.     mainWin::ActivateTaskbarButtons
  450.  
  451.     return
  452. }
  453.  
  454. ###############################################################################
  455. # AutomaticDownload
  456. #    Resumes a download where the user told Getleft to leave it.
  457. #
  458. # Parameter:
  459. #    url: The url to resume downloading.
  460. ###############################################################################
  461. proc AutomaticDownload {requestedUrl} {
  462.     global directories dirGetleft getleftState
  463.     global labelMessages labelTitles
  464.  
  465.     if {$requestedUrl==""} return
  466.     set domain [lindex [HtmlParser::ParseUrl $requestedUrl] 1]
  467.     set domain [string tolower $domain]
  468.  
  469.     set getleftState(filesChosen) 0
  470.  
  471.     set optionsFile [file join $dirGetleft(conf) $domain.gdt]
  472.     if {[file exists $optionsFile]} {
  473.         if {[catch {source $optionsFile} errorMsg]} {
  474.             if {$::DEBUG==1} {
  475.                 tk_messageBox -icon error -type ok -title Error \
  476.                         -message "Error reading saved data:\n$errorMsg"
  477.             }
  478.         } else {
  479.             mainWin::UrlListIncrResume $requestedUrl
  480.         }
  481.     } 
  482.     StartDownload $requestedUrl
  483.  
  484.     return
  485. }
  486.  
  487. ###############################################################################
  488. # PutUrlInQueue
  489. #    Puts the url and all related data into urlsToDownload
  490. #
  491. # Parameters:
  492. #    url: Url to download.
  493. #    dir: Directory where it will be saved.
  494. #    options: List with the options to use with the download.
  495. ###############################################################################
  496. proc PutUrlInQueue {url dir options} {
  497.     global getleftState urlsToDownload
  498.  
  499.     set urlsToDownload($url)     1
  500.     set urlsToDownload($url,dir) $dir
  501.     if {[lsearch $getleftState(urlQueue)  $url]==-1} {
  502.         mainWin::UrlListEnterEntry        $url 0 $dir
  503.         lappend getleftState(urlQueue)    $url
  504.         mainWin::SetResumeSitesMenu
  505.         set urlsToDownload($url,resume) 0
  506.     }
  507.  
  508.     set urlsToDownload($url,options) $options
  509.  
  510.     return
  511. }
  512.  
  513. ################################################################################
  514. # StartDownload
  515. #    Gets all the data for a download from 'UrlsToDownload' and gets on with it.
  516. #
  517. # Parameter
  518. #    requestedUrl: The url to download.
  519. ################################################################################
  520. proc StartDownload {requestedUrl} {
  521.     global getleftOptions downOptions siteIndex
  522.     global directories dirGetleft getleftState urlsToDownload
  523.     global labelMessages labelTitles
  524.  
  525.     if {![info exists urlsToDownload($requestedUrl)]} {
  526.         tk_messageBox -icon error -title $labelTitles(error) -type ok \
  527.                 -message "No hay urlToDownload($requestedUrl)"
  528.     }
  529.  
  530.     if {([info exists getleftOptions(useAuthProxy)])\
  531.             &&($getleftOptions(useAuthProxy)==1)} {
  532.         if {(![info exists getleftOptions(proxyPass)]) \
  533.                 ||($getleftOptions(proxyPass)=="")} {
  534.             if {[::Herramientas::GetPass]==0} {
  535.                 return
  536.             }
  537.         }
  538.     }
  539.  
  540.     set directories(base) $urlsToDownload($requestedUrl,dir)
  541.     array set downOptions $urlsToDownload($requestedUrl,options)
  542.     set getleftState(url) $requestedUrl
  543.     incr urlsToDownload($requestedUrl,resume)
  544.  
  545.     set getleftState(downloading) 1
  546.  
  547.     mainWin::ActivateTaskbarButtons
  548.     set requestedUrl  [InitializeDownload $requestedUrl]
  549.     if {$requestedUrl==""} {
  550.         TheEnd 1
  551.         return
  552.     }
  553.     set localFileName [::Commands::UrlToFile $requestedUrl $directories(base)]
  554.     set Descargar::filesProcessed($localFileName) 0
  555.     if {($getleftOptions(stopFile)==1)||($downOptions(levels)==0)\
  556.             ||(![regexp -nocase {\.html?$} $localFileName])} {
  557.         if {![file exists $localFileName.html]} {
  558.             TheEnd $getleftState(autoDown)
  559.             return
  560.         }
  561.     }
  562.     Descargar::Preprocessing $requestedUrl 0
  563.     if {($getleftState(autoDown)==0)&&($getleftState(filesChosen)==0)} {
  564.         if {$HtmlParser::nLinks==1} {
  565.              tk_messageBox -icon info -title $labelTitles(noLinks) -type ok \
  566.                      -message $labelMessages(noLinks)
  567.  
  568.             set getleftState(downloading) 0
  569.             catch {wm withdraw $::Ventana::window(top)}
  570.             TheEnd 1
  571.             return
  572.         }
  573.         set getleftState(filesChosen) \
  574.                 [ChooseLinks::ChooseDownloads $requestedUrl HtmlParser::links]
  575.     } else {
  576.         if {$getleftState(autoDown)==0} {
  577.             for {set i 1;set j 0} {$i<$HtmlParser::nLinks} {incr i;incr j} {
  578.                 if {($downOptions(map)==0)||($getleftState(mapDone)==0)} {
  579.                     set HtmlParser::links($i,ok) [lindex $getleftState(chosenLinks) $j]
  580.                 } else {
  581.                     set HtmlParser::links($i,ok) [lindex $getleftState(mapLinks) $j]
  582.                 }
  583.             }
  584.         } else {
  585.             set getleftState(chosenLinks) ""
  586.             for {set i 1;set j 0} {$i<$HtmlParser::nLinks} {incr i} {
  587.                 lappend getleftState(chosenLinks) $HtmlParser::links($i,ok)
  588.             }
  589.         }
  590.         set getleftState(filesChosen) 1
  591.     }
  592.     if {$getleftState(filesChosen)==1} {
  593.         if {$downOptions(map)==1} {
  594.             set onlyHtmlTmp           $downOptions(onlyHtml)
  595.             set downOptions(onlyHtml) 1
  596.             set siteIndex             1
  597.             if {![info exists getleftState(mapDone)]} {
  598.                 set getleftState(mapDone) 0
  599.             }
  600.         }
  601. #        set ::start [clock seconds]
  602.         Descargar::ControlDownloading $requestedUrl 1
  603.         if {[info exists Descargar::oneHundredLosers]} {
  604.             foreach {url nada} [array get Descargar::oneHundredLosers] {
  605.                 Descargar::Preprocessing $url 0
  606.                 Descargar::ControlDownloading $url 1
  607.             }
  608.         }
  609. #        set ::fin   [clock seconds]
  610. #        puts "Time: [expr $::fin - $::start]"
  611.         if {$downOptions(map)==0} {
  612.             TheEnd $getleftState(autoDown)
  613.         } else {
  614.             if {$getleftState(autoDown)==0} {
  615.                 DownloadFromMap $requestedUrl
  616.             } else {
  617.                 set getleftOptions(stopFile) 1
  618.             }
  619.             TheEnd
  620.             catch "unset siteMap"
  621.             catch "unset HtmlParser::links"
  622.             set downOptions(onlyHtml) $onlyHtmlTmp
  623.         }
  624.         set getleftState(filesChosen) 0
  625.     } else {
  626.         set getleftOptions(stopFile) 1
  627.         TheEnd
  628.     }
  629.     return
  630. }
  631.  
  632. ###############################################################################
  633. # DownloadFromMap
  634. #    Download the links chosen in the map of the site
  635. #
  636. # Parameter:
  637. #    requestedUrl: The url the user entered to begin mapping
  638. ###############################################################################
  639. proc DownloadFromMap {requestedUrl} {
  640.     global siteIndex siteMap getleftOptions downOptions getleftState
  641.     global directories
  642.  
  643.     set downOptions(onlyHtml)  0
  644.     set tmpLevels              $downOptions(levels)
  645.     set downOptions(levels)    0
  646.  
  647.     if {$siteIndex==1} {
  648.         return
  649.     }
  650.  
  651.     if {$getleftState(mapDone)==0} {
  652.         set getleftState(mapDone) 1
  653.         HtmlParser::FilterLinks $requestedUrl ::siteMap 0
  654.         set done [ChooseLinks::ChooseDownloads "" ::siteMap]
  655.         if {$done==0} {
  656.             set downOptions(levels)       $tmpLevels
  657.             set downOptions(map)          0
  658.             set getleftState(downloading) 0
  659.             return
  660.         }
  661.     }
  662.  
  663.     for {set i 1} {$i<$siteIndex} {incr i} {
  664.         if {$siteMap($i,ok)==1} {
  665.             set enlace $siteMap($i,url)
  666.             set filename [::Commands::UrlToFile $enlace $directories(base)]
  667.             if {[file exists $filename]} {
  668.                 continue
  669.             } else {
  670.                 set isHtml [regexp -nocase {\.html?$} $filename]
  671.                 Descargar::Download $enlace "-" $isHtml
  672.             }
  673.             if {$getleftOptions(stopFile)==1} {
  674.                  set downOptions(levels) $tmpLevels
  675.                  return
  676.             }
  677.             if {$getleftOptions(pauseFile)==1} {
  678.                 Ventana::Pause file
  679.             }
  680.         }
  681.     }
  682.     set downOptions(levels)   $tmpLevels
  683.     set downOptions(map)      0
  684.     set getleftState(mapDone) 0
  685.     catch {unset getleftState(mapLinks)}
  686.  
  687.     return
  688. }
  689.  
  690. ###############################################################################
  691. # SaveDownloadData
  692. #     Saves the data needed to automatically resume a download.
  693. #
  694. # Parameter
  695. #     url: The url we where downloading from.
  696. ###############################################################################
  697. proc SaveDownloadData {url} {
  698.     global dirGetleft getleftOptions downOptions siteUrl directories 
  699.     global getleftState urlsDownloaded
  700.  
  701.     set domain [lindex [HtmlParser::ParseUrl $url] 1]
  702.     set domain [string tolower $domain]
  703.     set fileName [file join $dirGetleft(conf) $domain.gdt]
  704.     catch {file delete -force "$fileName"}
  705.     set file [open "$fileName" w]
  706.  
  707.     puts $file "# Data to resume downloading $domain"
  708.     puts $file "# This file is generated automatically, please do not edit"
  709.     puts $file "\n\n"
  710.     puts $file "set getleftState(filesChosen)  $getleftState(filesChosen)"
  711.     if {$getleftState(filesChosen)==1} {
  712.         puts $file "set getleftState(mapDone)      $getleftState(mapDone)"
  713.         puts $file "set getleftState(chosenLinks)  \[list $getleftState(chosenLinks)\]"
  714.  
  715.         if {[info exists getleftState(mapLinks)]} {
  716.             puts $file "set getleftState(mapLinks) \[list $getleftState(mapLinks)\]"
  717.         }
  718.         if {$downOptions(map)==0} {
  719.             puts $file "\n\n# Urls that have been already completed\n\n"
  720.             foreach {url level} [array get urlsDownloaded] {
  721.                 regsub {\$} $url {\\$} url
  722.                 puts $file "set urlsDownloaded($url) $level"
  723.             }
  724.         }
  725.         puts $file "\n\n# Urls that have been already downloaded\n\n"
  726.         foreach {url nada} [array get Descargar::downloaded] {
  727.             regsub {\$} $url {\\$} url
  728.             puts $file "set \"Descargar::downloaded($url)\" 1"
  729.         }
  730.     }
  731.     puts $file "\n\n"
  732.     close $file
  733.  
  734.     return
  735. }
  736.  
  737. ###############################################################################
  738. # ReadConfig
  739. #    Reads the configuration files
  740. #
  741. # Parameter:
  742. #    Configuration file to read, if not present, the user configuration  file
  743. #    will be read.
  744. #
  745. # Returns:
  746. #    '0' if all went well, '1' if the file couldn't be found
  747. ###############################################################################
  748. proc ReadConfig { {confFile {} } } {
  749.     global urlHistory urlIndex dirGetleft getleftOptions urlsToDownload
  750.     global getleftState defaultDownOptions env
  751.  
  752.     if {$confFile!=""} {
  753.         set ficherorc $confFile
  754.     } else {
  755.         if {$getleftState(os)=="win"} {
  756.             set ficherorc [file join "$dirGetleft(conf)" getleft.ini]
  757.         } else {
  758.             set ficherorc [file join "$dirGetleft(conf)" getleft.conf]
  759.         }
  760.     }
  761.  
  762.     array set defaultDownOptions [list exLevels 0 resume 1 map 0 filter {} images 0 \
  763.             onlyHtml 0 levels -1 external 0 update 0 cgi 0 dir 1]
  764.  
  765.     set getleftState(urlQueue) ""
  766.     set getleftState(delaySet) 0
  767.     set urlHistory ""
  768.     if {[catch {open $ficherorc r} handle]} {
  769.         if {![info exists getleftOptions(lang)]} {
  770.             set getleftOptions(lang) en
  771.         }
  772.         set urlIndex 0
  773.         return 1
  774.     }
  775.  
  776.     for {} {![eof $handle]} {} {
  777.         set line [gets $handle]
  778.         if {[regexp {^#|^ |^$} $line]} {
  779.             continue
  780.         }
  781.         if {[regexp {(?:\[)(.*)(?:\])} $line nada active]} {
  782.             continue
  783.         }
  784.         switch -regexp -- $active {
  785.             historial|urlHistory {
  786.                  lappend urlHistory $line
  787.             }
  788.             urlIndex|hisIndex {
  789.                 set urlIndex $line
  790.             }
  791.             ^proxy$ {
  792.                 set getleftOptions(httpProxy)    $line
  793.                 set getleftOptions(ftpProxy)     $line
  794.                 set getleftOptions(sameProxy)    1
  795.                 set getleftOptions(proxy)        1
  796.             }
  797.             httpProxy {
  798.                 set getleftOptions(httpProxy)    $line
  799.                 set getleftOptions(proxy)        1
  800.             }
  801.             ftpProxy {
  802.                 set getleftOptions(ftpProxy)     $line
  803.                 set getleftOptions(proxy)        1
  804.             }
  805.             sameProxy {
  806.                 set getleftOptions(sameProxy)    $line
  807.             }
  808.             proxyUser {
  809.                 set getleftOptions(proxyUser)    $line
  810.             }
  811.             proxyPass {
  812.                 set getleftOptions(proxyPass)    $line
  813.             }
  814.             useAuthProxy {
  815.                 set getleftOptions(useAuthProxy) $line
  816.             }
  817.             saveAuthPass {
  818.                 set getleftOptions(saveAuthPass) $line
  819.             }
  820.             ^language$ {
  821.                 set getleftOptions(lang)         $line
  822.             }
  823.             scripts {
  824.                 set dirGetleft(scripts)          $line
  825.             }
  826.             images {
  827.                 set dirGetleft(images)           $line
  828.             }
  829.             doc {
  830.                 set dirGetleft(doc)              $line
  831.             }
  832.             languages {
  833.                 set dirGetleft(languages)        $line
  834.             }
  835.             lastDir {
  836.                 set dirGetleft(lastDir)          $line
  837.             }
  838.             toolDir {
  839.                 set dirGetleft(toolDir)          $line
  840.             }
  841.             urlQueue {
  842.                 lappend getleftState(urlQueue)   $line
  843.             }
  844.             urlsToDownload {
  845.                 eval "$line"
  846.             }
  847.             delaySet {
  848.                 set getleftState(delaySet)       $line
  849.             }
  850.             delayData {
  851.                 eval "$line"
  852.             }
  853.             defaultOptions {
  854.                 array set defaultDownOptions     $line
  855.             }
  856.             browser {
  857.                 set getleftState(browser)        $line
  858.             }
  859.             icons   {
  860.                 set dirGetleft(icons)            $line
  861.             }
  862.         }
  863.     }
  864.     close $handle
  865.  
  866.     if {![info exists getleftOptions(lang)]} {
  867.         set getleftOptions(lang) en
  868.     }
  869.     if {![info exists getleftOptions(useAuthProxy)]} {
  870.         set getleftOptions(useAuthProxy) 0
  871.     }
  872.     if {![info exists urlIndex]} {
  873.         set urlIndex 0
  874.     }
  875.  
  876.     # Just in case the user uninstalls a wrapped version and installs a
  877.     # normal one or viceversa
  878.     if {[info exists dirGetleft(icons)]} {
  879.         if {![file exists $dirGetleft(icons)]} {
  880.             set tmpDir [file tail $dirGetleft(icons)]
  881.             set dirGetleft(icons) [file join [GetMainDirectory] images $tmpDir]
  882.         }
  883.     }
  884.     if {$getleftState(delaySet)==1} {
  885.         Delay::DelayedSetStartTime
  886.     }
  887.     return 0
  888. }
  889.  
  890. ###############################################################################
  891. # SaveConfig
  892. #   Saves the configuration
  893. ###############################################################################
  894. proc SaveConfig {} {
  895.     global urlHistory urlIndex dirGetleft getleftOptions urlsToDownload
  896.     global getleftState defaultDownOptions env
  897.     global labelMessages labelTitles
  898.  
  899.     if {$getleftState(os)=="win"} {
  900.         set ficherorc [file join "$dirGetleft(conf)" getleft.ini]
  901.         # I got a bug report that said that Win2K doesn't like to
  902.         # open hidden files, so I unhide it before opening
  903.         if {[file exists $ficherorc]} {
  904.             file attributes $ficherorc -hidden 0
  905.         }
  906.     } else {
  907.         set ficherorc [file join "$dirGetleft(conf)" getleft.conf]
  908.     }
  909.     if {[catch {open  $ficherorc w+} fichero]} {
  910.         tk_messageBox -title $labelTitles(error) -icon error \
  911.             -message "$labelMessages(saveConfig)\n$fichero"
  912.         return
  913.     }
  914.  
  915.     puts $fichero "# Please do not edit unless you know what you are doing.\n\n"
  916.  
  917.     puts $fichero "\[urlHistory\]\n"
  918.     if {![catch {llength $urlHistory} len]} {
  919.         for {set i 0} {$i<$len} {incr i} {
  920.             puts $fichero [lindex $urlHistory $i]
  921.         }
  922.     }
  923.  
  924.     puts $fichero "\n\[urlIndex\]\n"
  925.     puts $fichero $urlIndex
  926.  
  927.     if {[info exists getleftOptions(httpProxy)]} {
  928.         puts $fichero "\n\[httpProxy\]\n"
  929.         puts $fichero "$getleftOptions(httpProxy)"
  930.         puts $fichero "\n\[ftpProxy\]\n"
  931.         puts $fichero "$getleftOptions(ftpProxy)"
  932.         puts $fichero "\n\[sameProxy\]\n"
  933.         puts $fichero "$getleftOptions(sameProxy)"
  934.         if {$getleftOptions(useAuthProxy)==1} {
  935.             if {$getleftOptions(saveAuthPass)==1} {
  936.                 puts $fichero "\n\[proxyPass\]\n"
  937.                 puts $fichero "$getleftOptions(proxyPass)"
  938.             }
  939.             puts $fichero "\n\[proxyUser\]\n"
  940.             puts $fichero "$getleftOptions(proxyUser)"
  941.             puts $fichero "\n\[useAuthProxy\]\n"
  942.             puts $fichero "$getleftOptions(useAuthProxy)"
  943.             puts $fichero "\n\[saveAuthPass\]\n"
  944.             puts $fichero "$getleftOptions(saveAuthPass)"
  945.         }
  946.     }
  947.  
  948.     puts $fichero "\n\[language\]\n"
  949.     puts $fichero "$getleftOptions(lang)"
  950.  
  951.     puts $fichero "\n\[lastDir\]\n"
  952.     puts $fichero "$dirGetleft(lastDir)"
  953.  
  954.     puts $fichero "\n\[toolDir\]\n"
  955.     puts $fichero "$dirGetleft(toolDir)"
  956.  
  957.     puts $fichero "\n\[delaySet\]\n"
  958.     puts $fichero "$getleftState(delaySet)"
  959.  
  960.     puts $fichero "\n\[defaultOptions\]\n"
  961.     puts $fichero [array get defaultDownOptions]
  962.  
  963.     puts $fichero "\n\[icons\]\n"
  964.     puts $fichero "$dirGetleft(icons)"
  965.  
  966.     if {[info exists getleftState(browser)]} {
  967.         puts $fichero "\n\[browser\]\n"
  968.         puts $fichero "$getleftState(browser)"
  969.     }
  970.  
  971.     if {$getleftState(delaySet)==1} {
  972.         puts $fichero "\n\[delayData\]\n"
  973.         puts $fichero "array set Delay::delayedDownload \
  974.                       \{[array get Delay::delayedDownload]\}"
  975.     }
  976.  
  977.     if {[llength $getleftState(urlQueue)]} {
  978.         puts $fichero "\n\[urlQueue\]\n"
  979.         foreach site $getleftState(urlQueue) {
  980.             puts $fichero $site
  981.         }
  982.         puts $fichero "\n\[urlsToDownload\]\n"
  983.         foreach site $getleftState(urlQueue) {
  984.             regsub -all {\s} $site    {\\&} siteTmp
  985.             regsub -all {\;} $siteTmp {\\;} siteTmp
  986.             puts $fichero "set urlsToDownload($siteTmp)         1"
  987.             puts $fichero "set urlsToDownload($siteTmp,dir)     \"$urlsToDownload($site,dir)\""
  988.             puts $fichero "set urlsToDownload($siteTmp,resume)  $urlsToDownload($site,resume)"
  989.             puts $fichero "set urlsToDownload($siteTmp,options) [list $urlsToDownload($site,options)]"
  990.         }
  991.     }
  992.     close $fichero
  993.  
  994.     if {$getleftState(os)=="win"} {
  995.         file attributes $ficherorc -hidden 1
  996.     } else {
  997.         file attributes $ficherorc -permissions 0600
  998.     }
  999.       
  1000.     return
  1001. }
  1002.  
  1003. ###############################################################################
  1004. # PutUrlInHistory
  1005. #    Put the given Url in the history of url
  1006. #
  1007. # Parameter
  1008. #    Puts, if need be, the given url in the history of urls.
  1009. ###############################################################################
  1010. proc PutUrlInHistory {url} {
  1011.     global urlHistory urlIndex
  1012.  
  1013.     set listItems [llength $urlHistory]
  1014.     set newListItems [llength $Ccombinado::cbArgs(items)]
  1015.     if {$listItems!=$newListItems} {
  1016.         set urlHistory $Ccombinado::cbArgs(items)
  1017.         set urlIndex   $newListItems
  1018.         SaveConfig
  1019.     }
  1020.  
  1021.     if {![EnHistorial $url]} {
  1022.         if {[llength $urlHistory]<10} {
  1023.             lappend urlHistory $url
  1024.         } else {
  1025.             set urlHistory [lreplace $urlHistory $urlIndex $urlIndex $url]
  1026.         }
  1027.         if {$urlIndex==9} {
  1028.             set urlIndex 0
  1029.         } else {
  1030.             incr urlIndex
  1031.         }
  1032.         SaveConfig
  1033.     }
  1034.     return
  1035. }
  1036.  
  1037. ###############################################################################
  1038. # MostrarHistorial
  1039. #    Shows the url history, only good for debuggin.
  1040. ###############################################################################
  1041. proc MostrarHistorial {} {
  1042.     global urlHistory urlIndex
  1043.  
  1044.     set len [llength $urlHistory]
  1045.     for {set i 0} {$i<$len} {incr i} {
  1046.         puts "$i: [lindex $urlHistory $i]"
  1047.     }
  1048.     return
  1049. }
  1050.  
  1051. ###############################################################################
  1052. # EnHistorial
  1053. #    Checks whether the given url is already in the url history
  1054. #
  1055. # Parameter:
  1056. #    pagina: given url
  1057. #
  1058. # Returns:
  1059. #    1 if it is.
  1060. #    0 if it is not
  1061. ###############################################################################
  1062. proc EnHistorial {pagina} {
  1063.     global urlHistory
  1064.  
  1065.     set len [llength $urlHistory]
  1066.     for {set i 0} {$i<$len} {incr i} {
  1067.         if {[catch {regsub {(http://)||(ftp://)} \
  1068.                 [lindex $urlHistory $i] {} una}]} {
  1069.             return 0
  1070.         }
  1071.         regsub {(http://)||(ftp://)} $pagina {} dos
  1072.  
  1073.         if {[string match $una $dos]} {
  1074.             return 1
  1075.         }
  1076.     }
  1077.     return 0
  1078. }
  1079.  
  1080. ###############################################################################
  1081. # ChangeLanguage
  1082. #    Changes the default language for the program
  1083. #
  1084. # Parameters:
  1085. #    lang: language to be used
  1086. ###############################################################################
  1087. proc ChangeLanguage {lang} {
  1088.     global getleftOptions
  1089.  
  1090.     set getleftOptions(lang) $lang
  1091.  
  1092.     wm withdraw .
  1093.  
  1094.     mainWin::MainWindow
  1095.  
  1096.     wm deiconify .
  1097.  
  1098.     SaveConfig
  1099.  
  1100.     return
  1101. }
  1102.  
  1103. ###############################################################################
  1104. # ChangeIconSet
  1105. #    Changes the default icon set for the program
  1106. ###############################################################################
  1107. proc ChangeIconSet {} {
  1108.     global dirGetleft getleftState
  1109.  
  1110.     wm withdraw .
  1111.  
  1112.     mainWin::MainWindow
  1113.  
  1114.     if {$getleftState(downloading)==0} {
  1115.         catch {destroy $::Ventana::window(top)}
  1116.     }
  1117.     catch {destroy $::getLog::siteLog(toplevel)}
  1118.     catch {destroy $::getLog::fileLog(win)}
  1119.  
  1120.     wm deiconify .
  1121.  
  1122.     SaveConfig
  1123.  
  1124.     return
  1125. }
  1126.  
  1127. ###############################################################################
  1128. # ReadSupportedLang
  1129. #    Reads the 'supported' file to know which languages this version supports
  1130. #    and puts then in supportedLang global variable
  1131. ###############################################################################
  1132. proc ReadSupportedLang {} {
  1133.     global dirGetleft supportedLang getleftState
  1134.     global labelTitles
  1135.  
  1136.     if {[catch {open [file join $dirGetleft(languages) supported] r} handle]} {
  1137.         tk_messageBox -type ok -icon error -title Error -message $handle
  1138.         return
  1139.     }
  1140.     set encoding cp1252
  1141.     fconfigure $handle -encoding $encoding
  1142.     for {set supportedLang(langList) ""} {![eof $handle]} {} {
  1143.         set line [gets $handle]
  1144.         if {[regexp {^#|^ |^$} $line]} {
  1145.             continue
  1146.         }
  1147.         set key      [lindex $line 0]
  1148.         set encoding [lindex $line 2]
  1149.         if {[catch {encoding convertfrom $encoding [lindex $line 1]} language]} {
  1150.             continue
  1151.         }
  1152.         set supportedLang($key)         $encoding
  1153.         set supportedLang($language)    $key
  1154.         lappend supportedLang(langList) $language
  1155.     }
  1156.     set supportedLang(langList) [lsort $supportedLang(langList)]
  1157.  
  1158.     close $handle
  1159.     return
  1160. }
  1161.  
  1162. ###############################################################################
  1163. # ReadLangFile
  1164. #    Reads one of the files with translations
  1165. #
  1166. # Parameter
  1167. #    The two letters code that identifies one language, i.e., 'es', 'en'
  1168. #
  1169. # Returns
  1170. #    - '0' all went well
  1171. #    - '1' there was an error
  1172. ###############################################################################
  1173. proc ReadLangFile {sufix} {
  1174.     global dirGetleft supportedLang
  1175.     global labelMenus labelButtons  labelTitles labelMessages
  1176.     global labelDialogs labelMonths labelFrames 
  1177.     global indexDialogs indexMenus indexButtons
  1178.     global labelCurlCodes confWizardLabels
  1179.  
  1180.     msgcat::mclocale $sufix
  1181.     msgcat::mcload   [file join $::tk_library msgs]
  1182.  
  1183.     set languageFile [file join $dirGetleft(languages) menus.$sufix]
  1184.  
  1185.     if {[catch {open $languageFile r} handle]} {
  1186.         tk_messageBox -icon error -type ok -title Error \
  1187.                 -message "File not found"
  1188.         return 1
  1189.     }
  1190.     fconfigure $handle -encoding $supportedLang($sufix)
  1191.  
  1192.     for {set active ""} {![eof $handle]} {} {
  1193.         set line [gets $handle]
  1194.         if {[regexp {^#|^ |^$} $line]} {
  1195.             continue
  1196.         }
  1197.         if {![string compare $line "End"]} {
  1198.             set active ""
  1199.             continue
  1200.         }
  1201.         set key   [lindex $line 0]
  1202.         set value [lindex $line 1]
  1203.  
  1204.         set index [string first & $value]
  1205.         if {$index!=-1} {
  1206.             regsub {&} $value {} value
  1207.         }
  1208.  
  1209.         switch -exact -- $active {
  1210.             Menus {
  1211.                 set indexMenus($key)       $index
  1212.                 set labelMenus($key)       $value
  1213.             }
  1214.             Buttons {
  1215.                 set indexButtons($key)     $index
  1216.                 set labelButtons($key)     $value
  1217.             }
  1218.             Titles {
  1219.                 set labelTitles($key)      $value
  1220.             }
  1221.             Messages {
  1222.                 set labelMessages($key)    $value
  1223.             }
  1224.             Dialogs {
  1225.                 set labelDialogs($key)     $value
  1226.                 set indexDialogs($key)     $index
  1227.             }
  1228.             Months {
  1229.                 set labelMonths($key)      $value
  1230.                 set labelMonths($value)    $key
  1231.             }
  1232.             Frames {
  1233.                 set labelFrames($key)      $value
  1234.             }
  1235.             curlCodes {
  1236.                 set labelCurlCodes($key)   $value
  1237.             }
  1238.             confWizard {
  1239.                 set confWizardLabels($key) $value
  1240.             }
  1241.             "" {
  1242.                 set active $line
  1243.             }
  1244.         }
  1245.     }
  1246.     close $handle
  1247.     return 0
  1248. }
  1249.  
  1250. ###############################################################################
  1251. # SetEncodings
  1252. #    Sets the array that maps the encoding names used in http to the
  1253. #    equivalent Tcl encodings.
  1254. ###############################################################################
  1255. proc SetEncodings {} {
  1256.     global charSets
  1257.  
  1258.     set charSets(ansi_x3.4-1968)        ascii
  1259.     set charSets(iso-ir-6)              ascii
  1260.     set charSets(iso_646.irv:1991)      ascii
  1261.     set charSets(iso646-us)             ascii
  1262.     set charSets(us-ascii)              ascii
  1263.     set charSets(us)                    ascii
  1264.     set charSets(ibm367)                ascii
  1265.     set charSets(cp367)                 ascii
  1266.     set charSets(ascii)                 ascii
  1267.  
  1268.     set charSets(big5)                  big5
  1269.  
  1270.     set charSet(dingbats)               dingbats
  1271.  
  1272.     set charSets(ks_c_5601-1987)        ksc5601
  1273.     set charSets(iso-ir-149)            ksc5601
  1274.     set charSets(ks_c_5601-1989)        ksc5601
  1275.     set charSets(ksc_5601)              ksc5601
  1276.     set charSets(korean)                ksc5601
  1277.  
  1278.     set charSets(euc-cn)                euc-cn
  1279.     set charSets(euc-jp)                euc-jp
  1280.     set charSets(euc-kr)                euc-kr
  1281.  
  1282.     set charSets(gb12345)               gb12345
  1283.     set charSets(gb1988)                gb1988
  1284.     set charSets(gb2312)                gb2312
  1285.  
  1286.     set charSets(iso-2022)              iso2022
  1287.     set charSets(iso-2022-jp)           iso2022-jp
  1288.     set charSets(iso2022-jp)            iso2022-jp
  1289.     set charSets(iso-2022-kr)           iso2022-kr
  1290.  
  1291.     set charSets(iso_8859-1:1987)       iso8859-1
  1292.     set charSets(iso-ir-100)            iso8859-1
  1293.     set charSets(iso_8859-1)            iso8859-1
  1294.     set charSets(iso-8859-1)            iso8859-1
  1295.     set charSets(latin1)                iso8859-1
  1296.     set charSets(l1)                    iso8859-1
  1297.     set charSets(ibm819)                iso8859-1
  1298.     set charSets(cp819)                 iso8859-1
  1299.     set charSets(iso8859-1)             iso8859-1
  1300.  
  1301.     set charSets(iso_8859-2:1987)       iso8859-2
  1302.     set charSets(iso-ir-101)            iso8859-2
  1303.     set charSets(iso_8859-2)            iso8859-2
  1304.     set charSets(iso-8859-2)            iso8859-2
  1305.     set charSets(latin2)                iso8859-2
  1306.     set charSets(l2)                    iso8859-2
  1307.     set charSets(iso8859-2)             iso8859-2
  1308.  
  1309.     set charSets(iso_8859-3:1988)       iso8859-3
  1310.     set charSets(iso-ir-109)            iso8859-3
  1311.     set charSets(iso_8859-3)            iso8859-3
  1312.     set charSets(iso-8859-3)            iso8859-3
  1313.     set charSets(latin3)                iso8859-3
  1314.     set charSets(iso8859-3)             iso8859-3
  1315.  
  1316.     set charSets(iso_8859-4:1988)       iso8859-4
  1317.     set charSets(iso-ir-110)            iso8859-4
  1318.     set charSets(iso_8859-4)            iso8859-4
  1319.     set charSets(iso-8859-4)            iso8859-4
  1320.     set charSets(latin4)                iso8859-4
  1321.     set charSets(l4)                    iso8859-4
  1322.     set charSets(iso8859-4)             iso8859-4
  1323.  
  1324.     set charSets(iso_8859-5:1988)       iso8859-5
  1325.     set charSets(iso-ir-144)            iso8859-5
  1326.     set charSets(iso_8859-5)            iso8859-5
  1327.     set charSets(iso-8859-5)            iso8859-5
  1328.     set charSets(cyrillic)              iso8859-5
  1329.     set charSets(iso8859-5)             iso8859-5
  1330.  
  1331.     set charSets(iso_8859-6:1987)       iso8859-6
  1332.     set charSets(iso-ir-127)            iso8859-6
  1333.     set charSets(iso_8859-6)            iso8859-6
  1334.     set charSets(iso-8859-6)            iso8859-6
  1335.     set charSets(ecma-114)              iso8859-6
  1336.     set charSets(asmo-708)              iso8859-6
  1337.     set charSets(arabic)                iso8859-6
  1338.     set charSets(iso8859-6)             iso8859-6
  1339.  
  1340.     set charSets(iso_8859-7:1987)       iso8859-7
  1341.     set charSets(iso-ir-126)            iso8859-7
  1342.     set charSets(iso_8859-7)            iso8859-7
  1343.     set charSets(iso-8859-7)            iso8859-7
  1344.     set charSets(elot_928)              iso8859-7
  1345.     set charSets(ecma-118)              iso8859-7
  1346.     set charSets(greek)                 iso8859-7
  1347.     set charSets(greek8)                iso8859-7
  1348.     set charSets(iso8859-7)             iso8859-7
  1349.  
  1350.     set charSets(iso_8859-8:1988)       iso8859-8
  1351.     set charSets(iso-ir-138)            iso8859-8
  1352.     set charSets(iso_8859-8)            iso8859-8
  1353.     set charSets(iso-8859-8)            iso8859-8
  1354.     set charSets(hebrew)                iso8859-8
  1355.     set charSets(iso8859-8)             iso8859-8
  1356.  
  1357.     set charSets(iso_8859-9:1989)       iso8859-9
  1358.     set charSets(iso-ir-148)            iso8859-9
  1359.     set charSets(iso_8859-9)            iso8859-9
  1360.     set charSets(iso-8859-9)            iso8859-9
  1361.     set charSets(latin5)                iso8859-9
  1362.     set charSets(l5)                    iso8859-9
  1363.     set charSets(iso8859-9)             iso8859-9
  1364.  
  1365.     set charSets(jis_x0212-1990)        jis0212
  1366.     set charSets(x0212)                 jis0212
  1367.     set charSets(iso-ir-159)            jis0212
  1368.     set charSets(jis0212)               jis0212
  1369.     set charSets(shiftjis)              shiftjis
  1370.  
  1371.     set charSets(jis_x0201)             jis0201
  1372.     set charSets(x0201)                 jis0201
  1373.     set charSets(jis0201)               jis0201
  1374.  
  1375.     set charSets(jis_c6226-1983)        jis0208
  1376.     set charSets(iso-ir-87)             jis0208
  1377.     set charSets(x0208)                 jis0208
  1378.     set charSets(jis_x0208-1983)        jis0208
  1379.     set charSets(jis0208)               jis0208
  1380.  
  1381.     set charSets(ibm437)                cp437
  1382.     set charSets(cp437)                 cp437
  1383.     set charSets(437)                   cp437
  1384.     set charSets(windows-437)           cp437
  1385.  
  1386.     set charSets(ibm737)                cp737
  1387.     set charSets(cp737)                 cp737
  1388.     set charSets(737)                   cp737
  1389.     set charSets(windows-737)           cp737
  1390.  
  1391.     set charSets(ibm775)                cp775
  1392.     set charSets(cp775)                 cp775
  1393.     set charSets(775)                   cp775
  1394.     set charSets(windows-775)           cp775
  1395.  
  1396.     set charSets(ibm850)                cp850
  1397.     set charSets(cp850)                 cp850
  1398.     set charSets(850)                   cp850
  1399.     set charSets(windows-850)           cp850
  1400.  
  1401.     set charSets(ibm852)                cp852
  1402.     set charSets(cp852)                 cp852
  1403.     set charSets(852)                   cp852
  1404.     set charSets(windows-852)           cp852
  1405.  
  1406.     set charSets(ibm855)                cp855
  1407.     set charSets(cp855)                 cp855
  1408.     set charSets(855)                   cp855
  1409.     set charSets(windows-855)           cp855
  1410.  
  1411.     set charSets(ibm857)                cp857
  1412.     set charSets(cp857)                 cp857
  1413.     set charSets(857)                   cp857
  1414.     set charSets(windows-857)           cp857
  1415.  
  1416.     set charSets(ibm860)                cp860
  1417.     set charSets(cp860)                 cp860
  1418.     set charSets(860)                   cp860
  1419.     set charSets(windows-860)           cp860
  1420.  
  1421.     set charSets(ibm861)                cp861
  1422.     set charSets(cp861)                 cp861
  1423.     set charSets(861)                   cp861
  1424.     set charSets(cp-is)                 cp861
  1425.     set charSets(windows-861)           cp861
  1426.  
  1427.     set charSets(ibm862)                cp862
  1428.     set charSets(cp862)                 cp862
  1429.     set charSets(862)                   cp862
  1430.     set charSets(windows-862)           cp862
  1431.  
  1432.     set charSets(ibm863)                cp863
  1433.     set charSets(cp863)                 cp863
  1434.     set charSets(863)                   cp863
  1435.     set charSets(windows-863)           cp863
  1436.  
  1437.     set charSets(ibm864)                cp864
  1438.     set charSets(cp864)                 cp864
  1439.     set charSets(864)                   cp864
  1440.     set charSets(windows-864)           cp864
  1441.  
  1442.     set charSets(ibm865)                cp865
  1443.     set charSets(cp865)                 cp865
  1444.     set charSets(865)                   cp865
  1445.     set charSets(windows-865)           cp865
  1446.  
  1447.     set charSets(ibm866)                cp866
  1448.     set charSets(cp866)                 cp866
  1449.     set charSets(866)                   cp866
  1450.     set charSets(windows-866)           cp866
  1451.  
  1452.     set charSets(ibm869)                cp869
  1453.     set charSets(cp869)                 cp869
  1454.     set charSets(869)                   cp869
  1455.     set charSets(cp-gr)                 cp869
  1456.     set charSets(windows-869)           cp869
  1457.  
  1458.     set charSets(ibm874)                cp874
  1459.     set charSets(cp874)                 cp874
  1460.     set charSets(874)                   cp874
  1461.     set charSets(windows-874)           cp874
  1462.  
  1463.     set charSets(ibm932)                cp932
  1464.     set charSets(cp932)                 cp932
  1465.     set charSets(932)                   cp932
  1466.     set charSets(windows-932)           cp932
  1467.  
  1468.     set charSets(ibm936)                cp936
  1469.     set charSets(cp936)                 cp936
  1470.     set charSets(936)                   cp936
  1471.     set charSets(windows-936)           cp936
  1472.  
  1473.     set charSets(ibm949)                cp949
  1474.     set charSets(cp949)                 cp949
  1475.     set charSets(949)                   cp949
  1476.     set charSets(windows-949)           cp949
  1477.  
  1478.     set charSets(ibm950)                cp950
  1479.     set charSets(cp950)                 cp950
  1480.     set charSets(950)                   cp950
  1481.     set charSets(windows-950)           cp950
  1482.  
  1483.     set charSets(ibm1250)               cp1250
  1484.     set charSets(cp1250)                cp1250
  1485.     set charSets(1250)                  cp1250
  1486.     set charSets(windows-1250)          cp1250
  1487.  
  1488.     set charSets(ibm1251)               cp1251
  1489.     set charSets(cp1251)                cp1251
  1490.     set charSets(1251)                  cp1251
  1491.     set charSets(windows-1251)          cp1251
  1492.  
  1493.     set charSets(ibm1252)               cp1252
  1494.     set charSets(cp1252)                cp1252
  1495.     set charSets(1252)                  cp1252
  1496.     set charSets(windows-1252)          cp1252
  1497.  
  1498.     set charSets(ibm1253)               cp1253
  1499.     set charSets(cp1253)                cp1253
  1500.     set charSets(1253)                  cp1253
  1501.     set charSets(windows-1253)          cp1253
  1502.  
  1503.     set charSets(ibm1254)               cp1254
  1504.     set charSets(cp1254)                cp1254
  1505.     set charSets(1254)                  cp1254
  1506.     set charSets(windows-1254)          cp1254
  1507.  
  1508.     set charSets(ibm1255)               cp1255
  1509.     set charSets(cp1255)                cp1255
  1510.     set charSets(1255)                  cp1255
  1511.     set charSets(windows-1255)          cp1255
  1512.  
  1513.     set charSets(ibm1256)               cp1256
  1514.     set charSets(cp1256)                cp1256
  1515.     set charSets(1256)                  cp1256
  1516.     set charSets(windows-1256)          cp1256
  1517.  
  1518.     set charSets(ibm1257)               cp1257
  1519.     set charSets(cp1257)                cp1257
  1520.     set charSets(1257)                  cp1257
  1521.     set charSets(windows-1257)          cp1257
  1522.  
  1523.     set charSets(ibm1258)               cp1258
  1524.     set charSets(cp1258)                cp1258
  1525.     set charSets(1258)                  cp1258
  1526.     set charSets(windows-1258)          cp1258
  1527.  
  1528.     set charSets(koi8-r)                koi8-r
  1529.     set charSets(koi8-u)                koi8-u
  1530.     set charSets(ksc5601)               ksc5601
  1531.  
  1532.     set charSets(maccenteuro)           macCentEuro
  1533.     set charSets(maccroatian)           macCroatian
  1534.     set charSets(maccyrillic)           macCyrillic
  1535.     set charSets(macdingbats)           macDingbats
  1536.     set charSets(macgreek)              macGreek
  1537.     set charSets(maciceland)            macIceland
  1538.     set charSets(macjapan)              macJapan
  1539.     set charSets(macroman)              macRoman
  1540.     set charSets(macromania)            macRomania
  1541.     set charSets(macthai)               macThai
  1542.     set charSets(macturkish)            macTurkish
  1543.     set charSets(macukraine)            macUkraine
  1544.  
  1545.     set charSets(tis620)                tis-620
  1546.     set charSets(tis-620)               tis-620
  1547.  
  1548.     set charSets(unicode)               unicode
  1549.     set charSets(utf-8)                 utf-8
  1550.  
  1551.     return
  1552. }
  1553.  
  1554. ###############################################################################
  1555. # ExitGetleft
  1556. #    This procedure is invoked when the user clicks to close the main window,
  1557. #    or in the 'Exit' menu entry, it checks whether the user is fooling around.
  1558. ###############################################################################
  1559. proc ExitGetleft {} {
  1560.     global getleftState
  1561.  
  1562.     if {$getleftState(downloading)==1} {
  1563.         set getleftState(exiting) 1
  1564.         if {[Ventana::CancelDownloading .]==0} {
  1565.             return
  1566.         }
  1567.         TheEnd
  1568.     }
  1569.     SaveConfig
  1570.     getLog::UrlLogWrite
  1571.  
  1572.     exit
  1573.  
  1574.     return
  1575. }
  1576.  
  1577.  
  1578.  
  1579. ###############################################################################
  1580. #                                PROGRAMA PRINCIPAL
  1581. ###############################################################################
  1582.  
  1583. set DEBUG 0
  1584.  
  1585. package require Tk
  1586.  
  1587. wm withdraw .
  1588.  
  1589. package require msgcat
  1590.  
  1591. set getleftState(os) [GetPlatform]
  1592.  
  1593. SetGetleftDirs $getleftState(os)
  1594.  
  1595. if {$argc!=0} {
  1596.     UninstallGetleft
  1597. }
  1598.  
  1599. ReadSupportedLang
  1600. ReadLangFile en
  1601. SetEncodings
  1602. SetGetleftColours
  1603.  
  1604. source [file join "$dirGetleft(scripts)" Ayuda.tcl]
  1605. source [file join "$dirGetleft(scripts)" UnderButton.tcl]
  1606. source [file join "$dirGetleft(scripts)" FrameLabel.tcl]
  1607. source [file join "$dirGetleft(scripts)" Herramientas.tcl]
  1608. source [file join "$dirGetleft(scripts)" delay.tcl]
  1609.  
  1610. if {[ReadConfig]} {
  1611.     source [file join "$dirGetleft(scripts)" getWizard.tcl]
  1612. }
  1613.  
  1614. source [file join "$dirGetleft(scripts)" mwutil.tcl]
  1615. source [file join "$dirGetleft(scripts)" tablelist.tcl]
  1616. source [file join "$dirGetleft(scripts)" tablelistConfig.tcl]
  1617. source [file join "$dirGetleft(scripts)" tablelistBind.tcl]
  1618. source [file join "$dirGetleft(scripts)" tablelistWidget.tcl]
  1619. source [file join "$dirGetleft(scripts)" tablelistEdit.tcl]
  1620. source [file join "$dirGetleft(scripts)" tablelistMove.tcl]
  1621. source [file join "$dirGetleft(scripts)" tablelistSort.tcl]
  1622. source [file join "$dirGetleft(scripts)" tablelistUtil.tcl]
  1623. source [file join "$dirGetleft(scripts)" balloon.tcl]
  1624. source [file join "$dirGetleft(scripts)" mainWin.tcl]
  1625. source [file join "$dirGetleft(scripts)" Ventana.tcl]
  1626.  
  1627. if {![info exists getleftState(downloading)]} {
  1628.     set getleftState(downloading)             0
  1629.     set getleftState(mapDone)                 0
  1630.     set getleftState(exiting)                 0
  1631.     set getleftState(autoDown)                0
  1632.     set getleftState(startNow)                1
  1633.     set getleftState(delayedDown)             0
  1634.     set getleftState(waiting)                 0
  1635.     set getleftState(filesChosen)             0
  1636.     set ::Ventana::Rizo::curlReport(nextFile) 0
  1637. }
  1638.  
  1639. mainWin::MainWindow
  1640. wm deiconify .
  1641. #tkwait visibility .
  1642. update
  1643.  
  1644. source [file join "$dirGetleft(scripts)" menuEntry.tcl]
  1645. source [file join "$dirGetleft(scripts)" Ccombinado.tcl]
  1646. source [file join "$dirGetleft(scripts)" Dialogos.tcl]
  1647. source [file join "$dirGetleft(scripts)" Commands.tcl]
  1648. source [file join "$dirGetleft(scripts)" Opciones.tcl]
  1649. source [file join "$dirGetleft(scripts)" CuadroSpin.tcl]
  1650. source [file join "$dirGetleft(scripts)" Descargar.tcl]
  1651. source [file join "$dirGetleft(scripts)" Progreso.tcl]
  1652. source [file join "$dirGetleft(scripts)" Cookies.tcl]
  1653. source [file join "$dirGetleft(scripts)" HtmlParser.tcl]
  1654. source [file join "$dirGetleft(scripts)" ChooseLinks.tcl]
  1655. source [file join "$dirGetleft(scripts)" getLog.tcl]
  1656. source [file join "$dirGetleft(scripts)" help.tcl]
  1657. source [file join "$dirGetleft(scripts)" EnterUrl.tcl]
  1658.  
  1659. CheckPrograms
  1660.  
  1661. Ventana::Rizo::SetCurlVersion
  1662.  
  1663. Opciones::SetDefaultOptions downOptions
  1664.  
  1665. set getleftState(urlsToAutoDown) ""
  1666.  
  1667. # We are going to delete the *.gdt files that shouldn't be there any more
  1668. set gdtFiles [glob -nocomplain [file join $dirGetleft(conf) *.gdt]]
  1669. foreach file $gdtFiles {
  1670.     set root [file rootname [file tail $file]]
  1671.     if {![regexp -nocase "$root" $getleftState(urlQueue)]} {
  1672.         file delete -force $file
  1673.     }
  1674. }
  1675.  
  1676. catch {focus -force [$mainWin::mainWin(listbox) bodypath]}
  1677.  
  1678.